#ifndef __CONTROLLER_H__
#define __CONTROLLER_H__

#include "Validator.hpp"
#include "GAcore.hpp"
#include "GAmodSettings.hpp"

/** \class ControllerException
 *  \brief Eccezioni lanciate dalla classe Controller
 */
class ControllerException : public EHW_Exception {
    public:
    /** Costruttore
     *
     *  \sa EHW_Exception::EHW_Exception
     */
    ControllerException(char *mess) : EHW_Exception(mess) {};
};


/** \class Controller
 *  \brief Classe astratta per la definizione del controller
 *
 *  Il Controller e' il modulo dedicato alla gestione dell'interazione con l'utente. Le sue funzionalita' principali sono
 *  quella di ricevere comandi dall'interfaccia verso l'utente, chiamare di conseguenza i metodi corretti sul GAcore e
 *  visualizzare i risultati intermedi e finali dell'elaborazione.
 */
class Controller {
    protected:
    //! GAcore controllato
    GAcore *myCore;

    //! Validatore del GAcore
    Validator *myValidator;

    public:
    /** Costruttore base. "Installa" il GAcore e ne ottiene il Validator.
     *
     *  \param[in]  gc          GAcore da controllare
     *  \param[in]  settings    Lista di settings per il controller
     */
    Controller(GAcore *gc, GAmodSettings &settings) throw(ControllerException)
    {
        if(!gc)
            throw ControllerException("Controller::Controller: GAcore non valido");

        this->myCore = gc;
        this->myValidator = gc->getValidator();

        if(!this->myValidator)
            throw ControllerException("Controller::Controller: Validator non valido");
    }

    /** Avvia l'esecuzione del Controller e quindi di tutto il framework
     *
     */
    virtual void start_execution() throw(ControllerException) = 0;
};

#endif
